package veterinario;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.ArrayList;

/** Classe que define o atendimento de um animal na clínica, com uma data, uma descrição da consulta, um custo e o tipo (se foi na clínica ou no domicílio).
 *
 * @author 2011101993 - Hugo Amaro
 * @author 2006130415 - Jorge Martins Alves
 */
public class Consulta implements Cobravel, Serializable, Comparable {
	private GregorianCalendar _dataf;
	private String _descricao;
	private float _custo = 0;
	private int _tipo;
        /**
         * @param _animal    objeto animal com todas as características que o definem.
         */
        public Animal _animal;
        /**
         * @param _medico   lista com os médicos que participaram na consulta.
         */
        public ArrayList<Medico> _medico = new ArrayList<Medico>();

        /** Construtor que recebe 3 parâmetros: data e descrição da consulta, o animal e a lista dos médicos.
         * 
         * @param data  data do atendimento no formato de acordo com a classe GregorianCalendar.
         * @param desc  texto com a descrição da consulta, onde se pode colocar tudo o que se achar pertinente como o problema do animal e o tratamento.
         * @param doente    objeto da classe Animal com todas as características que o definem.
         * @param medicos   lista com os médicos que participaram na consulta.
         */
        public Consulta(GregorianCalendar data, String desc, Animal doente, ArrayList<Medico> medicos){
            this._dataf = new GregorianCalendar(data.get(GregorianCalendar.YEAR), data.get(GregorianCalendar.MONTH), data.get(GregorianCalendar.DAY_OF_MONTH));
            _descricao = desc;
            _animal = doente;
            _medico.addAll(medicos);
        }

        /** Método set para definir a data do atendimento.
         * 
         * @param aDataf    data do atendimento no formato de acordo com a classe GregorianCalendar.
         */
        public void setDataf(GregorianCalendar aDataf) {
            if(aDataf==null)
                this._dataf = null;
            else
		this._dataf = new GregorianCalendar(aDataf.get(GregorianCalendar.YEAR), aDataf.get(GregorianCalendar.MONTH), aDataf.get(GregorianCalendar.DAY_OF_MONTH));
	}

        /** Método get que devolve a data do atendimento.
         * 
         * @return  data do atendimento no formato de acordo com a classe GregorianCalendar.
         */
        public GregorianCalendar getDataf() {
		return this._dataf;
	}

        /** Método set para definir a descrição do atendimento (problema do animal, tratamento, etc).
         * 
         * @param aDescricao    texto com a descrição da consulta, como por exemplo o problema do animal e o tratamento.
         */
        public void setDescricao(String aDescricao) {
		this._descricao = aDescricao;
	}

        /** Método get que devolve a descrição do atendimento.
         * 
         * @return  texto com a descrição da consulta, como por exemplo o problema do animal e o tratamento.
         */
        public String getDescricao() {
		return this._descricao;
	}

        /** Método set para definir o valor a ser pago pelo atendimento.
         * 
         * @param aCusto    número, inteiro ou não, com o custo da consulta.
         */
        public void setCusto(float aCusto) {
		this._custo = aCusto;
	}

        /** Método get que devolve o valor a ser pago pelo atendimento.
         * 
         * @return  número, inteiro ou não, com o custo da consulta.
         */
        public float getCusto() {
		return this._custo;
	}

        /** Método set para definir se a consulta é na clínica ou no domicílio.
         * 
         * @param aTipo inteiro =0 se for consulta na clínica ou =1 se for no domicílio.
         */
        public void setTipo(int aTipo) {
		this._tipo = aTipo;
	}

        /** Método get que devolve o tipo da consulta (se na clínica ou no domicílio).
         * 
         * @return  inteiro =0 se for consulta na clínica ou =1 se for no domicílio.
         */
        public int getTipo() {
		return this._tipo;
	}

        /** Método get que devolve o animal atendido na consulta.
         * 
         * @return  objecto do tipo Animal que define o animal atendido na consulta.
         */
        public Animal getAnimal() {
		return this._animal;
	}

        /** Método get que devolve a lista dos médicos que participaram na consulta.
         * 
         * @return  ArrayList com objectos do tipo Médico que definem os médicos participantes na consulta.
         */
        public ArrayList<Medico> getMedicos(){
            return _medico;
        }

        /** Método que devolve o valor da consulta.
         * 
         * @return  float com o valor da consulta.
         */
        public float custo() {
		return this._custo;
	}

        /** Compara consultas com internamentos e consultas, pela data.
         * 
         * @param Outra consulta ou um internamento com o qual comparar.
         * @return  -1 se this é anterior ao evento dado como argumento, 0 se igual, e 1 se posterior
         */
        public int compareTo(Object o){
            if(o.getClass() == Consulta.class){
                return this._dataf.compareTo(((Consulta)o).getDataf());
            }else if(o.getClass() == Internamento.class){
                return this._dataf.compareTo(((Internamento)o).getDataf());
            }
            return 0;
        }

        /** Método que devolve uma String com informação sobre a consulta.
         * 
         * @return  texto com a data e tipo da consulta (clínica ou domicílio), identificador único e raça do animal atendido, os médicos e o custo do atendimento.
         */
        public String listaString(){
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String tipo = "Clínica";
            if(this.getTipo()==1)
                tipo = "Domicílio";
            String medicos = "";
            for(int i=0; i<this.getMedicos().size(); i++){
                medicos += this.getMedicos().get(i).getNome();
                if(i<this.getMedicos().size()-1)
                    medicos += ", ";
                        }
            return "Data: "+dateFormat.format(this.getDataf().getTime()).toString()+" Tipo: "+tipo+" Animal[ Id:"+this.getAnimal().getId()+" Raca:"+this.getAnimal().getRaca()+"] Medicos["+medicos+"] Valor: € "+this.custo();
        }
}